﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using FastFood.Business.Entities;
using FastFood.Business.Logic;
using WeifenLuo.WinFormsUI.Docking;
using WindowsControls.VB;

namespace FastFood.Windows.Paneles
{
    enum TipoItem
    {
        Modulo = 0,
        Carpeta = 1,
        Formulario = 2
    }

    public partial class FrmExplorador : FrmWindow
    {
        private List<FastFood.Business.Entities.Menus> listaMenus;

        #region Common

        public FrmExplorador()
        {
            InitializeComponent();
        }

        private void FrmExplorador_Load(object sender, EventArgs e)
        {
            if (DesignMode == false) _LblModulo.Text = string.Empty;
        }

        private void FrmExplorador_VisibleChanged(object sender, EventArgs e)
        {
            if (this.Visible)
            {
                listaMenus = new MenuCn().ObtenerMenusRaicesPorUsuario(DatosGenerales.PersonalActual.personalID);
                this.LoadMenusFlexibles();
            }
        }

        private void _TvwFormularios_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            FormularioCn formulariosManager = new FormularioCn();
            if (e.Node.ImageIndex == (int)TipoItem.Formulario)
            {
                try
                {
                    byte id = (byte)e.Node.Tag;
                    Formularios formulario = formulariosManager.ObtenerFormularioPorID(id);
                    if ((formulario != null))
                    {
                        if (formulario.nombre.Trim().Length != 0)
                        {
                            FrmDocumento _FormularioView = CrearNuevoFormulario(formulario);
                            _FormularioView.Show(DockPanel);
                        }
                    }
                }
                catch (Exception)
                {
                    //Mensaje.ShowMessageAlert(this, Constantes.TituloMensaje, ex.Message);
                }
            }
        }

        private void _TvwFormularios_AfterSelect(object sender, TreeViewEventArgs e)
        {
            _TvwFormularios.SelectedImageIndex = _TvwFormularios.SelectedNode.ImageIndex;
        }

        private FrmDocumento CrearNuevoFormulario(Formularios formulario)
        {
            FrmDocumento _formularioView = new FrmDocumento(formulario);

            IDockContent _DockTab = BuscarFormulario(formulario.nombre);
            while (_DockTab != null)
            {
                return (FrmDocumento)_DockTab;
            }
            return _formularioView;
        }

        private IDockContent BuscarFormulario(string text)
        {
            foreach (IDockContent content in DockPanel.Documents)
            {
                if (content.DockHandler.TabText == text)
                {
                    return content;
                }
            }
            return null;
        }

        private void _OutlookBar_ButtonClicked(object sender, EventArgs e)
        {
            _LblModulo.Text = _OutlookBar.SelectedButton.Text;
            this.LoadArbolByMenuFlexible(Convert.ToByte(_OutlookBar.SelectedButton.Code));
            _TvwFormularios.ExpandAll();
        }

        #endregion

        #region Explorador Flexible

        private void LoadMenusFlexibles()
        {
            try
            {
                _OutlookBar.Buttons.Clear();
                int index = 1;
                foreach (Menus item in listaMenus)
                {
                    OutlookBarButton botton = new OutlookBarButton(index + 1, item.nombre, FastFood.Windows.Properties.Resources.Administracion, item.menuID.ToString());
                    _OutlookBar.Buttons.Add(botton);
                    _OutlookBar.Height += 40;
                    index += 1;
                }
            }
            catch (Exception)
            {
                //Mensaje.ShowMessageAlert(this, Constantes.TituloMensaje, ex.Message);
            }
            if (_OutlookBar.Buttons.Count > 0)
            {
                _OutlookBar.Buttons[0].Selected = true;
            }
        }

        private void LoadArbolByMenuFlexible(byte menuID)
        {
            Menus menu = null;
            foreach (Menus item in listaMenus)
            {
                if (item.menuID == menuID) menu = item;
            }
            if (menu != null)
            {
                try
                {
                    _TvwFormularios.Nodes.Clear();
                    _TvwFormularios.ImageList = this.ImgLst;
                    _TvwFormularios.ItemHeight = 25;

                    TreeNode tn = new TreeNode(_LblModulo.Text);
                    tn.ImageIndex = (int)TipoItem.Modulo;
                    tn.Tag = menuID;

                    LoadMenusByNodo(tn, menu.MenusHijos);
                    LoadFormulariosByNodo(tn, menu.Formularios);
                    _TvwFormularios.Nodes.Add(tn);
                    _TvwFormularios.Dock = DockStyle.Fill;
                    _TvwFormularios.Nodes[0].Expand();
                }
                catch (Exception)
                {
                    //Mensaje.ShowMessageAlert(this, Constantes.TituloMensaje, ex.Message);
                }
            }
        }

        private void LoadMenusByNodo(TreeNode padre, IList<FastFood.Business.Entities.Menus> menus)
        {
            if (menus != null)
            {
                foreach (Menus menu in menus)
                {
                    TreeNode tnO = new TreeNode(menu.nombre);
                    tnO.ImageIndex = (int)TipoItem.Carpeta;
                    tnO.Tag = menu.menuID;
                    tnO.ToolTipText = menu.descripcion;

                    LoadMenusByNodo(tnO, menu.MenusHijos);
                    LoadFormulariosByNodo(tnO, menu.Formularios);
                    padre.Nodes.Add(tnO);
                }
            }
        }

        private void LoadFormulariosByNodo(TreeNode padre, IList<Formularios> formularios)
        {            
            foreach (Formularios formulario in formularios)
            {   
                TreeNode tnO = new TreeNode(formulario.nombre);
                tnO.ImageIndex = (int)TipoItem.Formulario;
                tnO.Tag = formulario.formularioID;
                tnO.ToolTipText = formulario.descripcion;
                padre.Nodes.Add(tnO);
            }
        }

        private bool ExistePermisosByMenu(byte menuID)
        {
            UsuarioCn usuarioCn = new UsuarioCn();
            MenuCn menuCn = new MenuCn();
            
            List<Permisos> permisos = new List<Permisos>();
            permisos.AddRange(usuarioCn.ObtenerPermisosByUsuarioAndMenuAndAcceso(DatosGenerales.PersonalActual.personalID, menuID));
            List<Menus> temp = menuCn.ObtenerMenusPorContenedor(menuID);
            foreach (Menus m in temp)
            {
                permisos.AddRange(usuarioCn.ObtenerPermisosByUsuarioAndMenuAndAcceso(DatosGenerales.PersonalActual.personalID, m.menuID));

            }
            return permisos.Count > 0 ? true : false;
        }

        #endregion
    }
}
